package com.springboot.mybatis.service;

import java.math.BigDecimal;
import java.util.Arrays;

/**
 * @author sunyt31481
 * @date 2020/8/7 11:41
 * @description
 */
public class MathTool {


    /**
     *加法
     *
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static String add(BigDecimal v1, BigDecimal v2){
        return(v1.add(v2).setScale(2,BigDecimal.ROUND_HALF_UP).toString());
    }

    /**
     * 减法
     *
     * @param v1 被减数
     *  @param v2 减数
     * @return 两个参数的差
     */
    public static String sub(BigDecimal v1, BigDecimal v2){
        return(v1.subtract(v2).setScale(2,BigDecimal.ROUND_HALF_UP).toString());
    }

    /**
     * 乘法
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static String mul(BigDecimal v1, BigDecimal v2){
        return(v1.multiply(v2).setScale(2,BigDecimal.ROUND_HALF_UP).toString());
    }

    /**
     * 除法
     *
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static String div(BigDecimal v1, BigDecimal v2){
        return(v1.divide(v2,2,BigDecimal.ROUND_HALF_UP).toString());
    }

    /**
     * 占比
     *
     * @param v1
     * @param v2
     * @return v1占v2的比例
     */
    public static String percentage(BigDecimal v1, BigDecimal v2){
        BigDecimal value100 = new BigDecimal(100);
        return(v1.divide(v2,2,BigDecimal.ROUND_HALF_UP)
                .multiply(value100)
                .setScale(2,BigDecimal.ROUND_HALF_UP).toString());
    }

    /**
     * 算数平均
     *
     * @param in 存放元素的数组
     * @return 数组内元素的均值
     */
    public static String mean(BigDecimal[] in){
        BigDecimal len = new BigDecimal(in.length);
        if (in == null) {
            return null;
        }
        BigDecimal sum = new BigDecimal(0);
        for (BigDecimal bigDecimal : in){
            sum = sum.add(bigDecimal);
        }
        return sum.divide(len, 2,BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 加权平均
     *
     * @param valIn 存放元素的数组
     * @param weightIn 存放权重的数组
     * @return 数组内元素的加权均值
     */
    public static String averagingWeighted(BigDecimal[] valIn, BigDecimal[] weightIn){
        BigDecimal len = new BigDecimal(valIn.length);
        if (valIn == null || weightIn == null) {
            return null;
        }
        BigDecimal sum = new BigDecimal(0);
        for (int i=0;i<valIn.length;i++){
            sum = sum.add(valIn[i].multiply(weightIn[i]));
        }
        return sum.divide(len, 2,BigDecimal.ROUND_HALF_UP).toString();
    }


    /**
    * 收益率
    *
    * @param maxPrice
    *@param closingPrice
    */
    public static String sumIntervalChart(BigDecimal maxPrice, BigDecimal closingPrice){
        BigDecimal value100 = new BigDecimal(100);
        return (maxPrice.subtract(closingPrice))
                .divide(closingPrice,6,BigDecimal.ROUND_HALF_UP)
                .multiply(value100)
                .setScale(6,BigDecimal.ROUND_HALF_UP).toString();
    }

    public static void main(String[] args) {
        //测试数据
        BigDecimal a = new BigDecimal(1.34535);
        BigDecimal b = new BigDecimal(1.34535);
        BigDecimal[] c = new BigDecimal[2];
        BigDecimal[] d = new BigDecimal[2];

        Arrays.fill(c, BigDecimal.valueOf(777));
        Arrays.fill(d, BigDecimal.valueOf(2.897));

        System.out.println(add(a,b));
        System.out.println(sub(a,b));
        System.out.println(mul(a,b));
        System.out.println(div(a,b));
        System.out.println(percentage(a,b));
        System.out.println(mean(c));
        System.out.println(averagingWeighted(c,d));
    }

}
